package com.ruoyi.thread;

//volatile即可解决这个问题！
//volatile关键字在Java中主要有两个作用：
//        确保内存可见性：volatile关键字能保证多个线程之间对共享变量的操作具有一致性，当一个线程修改一个共享变量时，其他线程能够立即看到修改的值。这是通过禁止指令重排序优化来实现的，从而保证了每个线程都能按照相同的顺序看到其他线程对共享变量的修改。
//        禁止指令重排序优化：正常的代码是从上往下执行的，但有时JVM会对代码进行优化，可能会改变代码的执行顺序。而volatile关键字会禁止这种指令重排序的优化，保证了代码按照原来的顺序执行。
//Synchronized保证可见性
//Synchronized保证可见性的原理，执行Synchronized时，会对应lock原子操作会刷新工作内存中共享变量的值。


public class Test1 {
    public static boolean flag = true;
    public static Object obj = new Object();

    //    public static boolean flag = true;
    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            while (flag) {
                synchronized (obj) {
                }
            }
        }).start();

        Thread.sleep(2000);

        new Thread(() -> {
            flag = false;
            System.out.println("线程修改了变量的值为false");
        }).start();
    }
}
